package com.itheima.health.controller;

import com.itheima.health.common.MessageConst;
import com.itheima.health.common.RedisConst;
import com.itheima.health.entity.Result;
import com.itheima.health.pojo.Member;
import com.itheima.health.pojo.Order;
import com.itheima.health.pojo.Setmeal;
import com.itheima.health.service.MemberService;
import com.itheima.health.service.OrderService;
import com.itheima.health.service.SetMealService;
import com.itheima.health.vo.OrderSubmitParam;
import com.itheima.health.vo.OrderVo;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 预约控制器
 */
@RestController
@RequestMapping("/mobile/order")
@Slf4j
@Api("手机端订单接口")
public class MobileOrderController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MemberService memberService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private SetMealService setMealService;

    /**
     * 提交预约信息
     *
     * @param param
     * @return
     */
    @RequestMapping("/submit")
    public Result submit(@RequestBody OrderSubmitParam param) {
        log.info("[提交预约信息]data：{}", param);

        //1-验证码验证 -- 这里设计 键比较复杂是为了在redis中区分不同作用的 key
        //找键  因为此业务是移动端体检提交业务 所以 type就是  ORDER
        String redisKey = RedisConst.VALIDATE_CODE_PREFIX +"_ORDER_"+param.getTelephone();
        //这种key的写法是遵循一种开发默认规则 不同公司规则不同
        //从redis 获取  验证码
        String code = redisTemplate.opsForValue().get(redisKey)+"";
        //之所以加"" 不写 toString() 是为了

        //2-创建会员 对象 用于做 新增或者更新
        // 将这次预约的 会员信息 使用member对象存储起来
        Member member = new Member();
        member.setIdCard(param.getIdCard());
        member.setPhoneNumber(param.getTelephone());
        member.setName(param.getName());
        member.setSex(param.getSex());
        Integer memberId = memberService.createOrUpdate(member);
        // 之所以 返回 member 对象 是因为 提交体检预约信息中需要存储 会员id

        //3-提交体检信息  orderService
        Order order = new Order();
        order.setOrderStatus(Order.ORDERSTATUS_NO);//订单状态是 未到诊呢
        order.setSetmealId(param.getSetMealId());// 选择的套餐
        order.setOrderType(Order.ORDERTYPE_WEIXIN);//预约的来源
        order.setOrderDate(param.getOrderDate());//预约的日期
        order.setMemberId(member.getId());//会员号
        order = orderService.add(order);//返回对象的目的是因为 前端需要 一个预约详情信息 基于接口文档得来

        //4-返回结果
        return new Result(true, MessageConst.ORDER_SUCCESS,order);
    }


    /**
     * 根据ID查询
     * @param id
     * @return
     */
    @RequestMapping("/findById")
    public Result findById(Integer id){
        // service 查询数据
        OrderVo orderVo = orderService.findOrderVoById(id);
        return new Result(true,MessageConst.QUERY_ORDER_SUCCESS,orderVo);
    }
}
